<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>apply</title>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
		</style>
	</head>
	<body>
		
		<script type="text/javascript">
			/*
				apply: 调用某个方法，将第一个参数作为函数中的this，使用这个函数
				与call的区别：它的第二个参数是一个数组或者伪数组
				func.apply(thisObj, [...]);
			*/
		   
			var name = "window";
			function fn (a, b, c) {
				console.log(this.name + " 算结果：" , a + b + c);
			}
			
			var user = {
				name: "张三"
			}
			
			// fn(1,2,4);
			
			// fn.call(user, 1,2,4);
			// fn.apply(user, [1,2,4]);
			
			// 求不定参的和  es6的剩余展开符 ...
			// 在函数的形参中，使用剩余参数 ...args，表示除了已经表明的对应了形参之外的所有实参的集合，是一个数组
			function sum (...args) {
				var count = 0;
				// console.log(args);
				// console.log(arguments);
				for(var i = 0; i < args.length; i ++){
					count += args[i];
				}
				// console.log(count);
				return count;
			}
			
			// 求不定参的2倍和
			function sum2x (...args) {
				// 调用求和函数，并将结果*2
				// return sum.apply(this, args) * 2;
				return sum.apply(this, arguments) * 2;
				
				// 展开运算符
				// return sum.call(this, ...args) * 2;
			}
			
			// console.log(sum2x(1,2,3,4));
			// console.log(sum2x(1,2,3,4,5));
			
			
			// 求不定参 n 倍的和，第一个实参作为倍数
			function sumNx (n, ...args) {
				// arguments   [].shift()
				// var n = Array.prototype.shift.call(arguments);
				// var n = [].shift.call(arguments);
				// console.log(arguments);
				// return sum.apply(this, arguments) * n;
				
				return sum.apply(this, args) * n;
			}
			
			console.log(sumNx(3,1,2,3,4));
			console.log(sumNx(5,1,2,3,4));
		</script>
	</body>
</html>